#include "sequential_table.h"
#include <stdlib.h>
#include <stdio.h>

/**
 * @brief 初始化顺序表（按照顺序存储结构分配内存空间）
 * @param list 顺序表
 * @param initSize 初始化容量，以节点的数据类型为单位
 * @return {@SeqListStatus_t}
 */
SeqListStatus_t SeqListInit(SeqList_t *list, int initSize)
{
    // 严格按照顺序存储结构分配内存空间
    list->data = (Node_t *) malloc(initSize * sizeof(Node_t));
    if (!list->data) {
        return SEQ_LIST_FAIL;
    }
    list->length = 0;
    list->capacity = initSize;
    return SEQ_LIST_SUCCESS;
}

/**
 * @brief 扩容
 * @param list 顺序表
 * @param newSize 新的容量
 * @return {@SeqListStatus_t}
 */
SeqListStatus_t SeqListResize(SeqList_t *list, int newSize)
{
    Node_t *newData = (Node_t *) realloc(list->data, newSize * sizeof(Node_t));
    if (!newData) {
        return SEQ_LIST_FAIL;
    }
    list->data = newData;
    list->capacity = newSize;
    return SEQ_LIST_SUCCESS;
}

/**
 * @brief 顺序表插入节点
 * @param list 顺序表
 * @param position 要插入节点的位置，从0开始
 * @param node 要插入的节点数据
 * @return {@SeqListStatus_t}
 */
SeqListStatus_t SeqListInsert(SeqList_t *list, int position, const Node_t *node)
{
    // 插入位置超出范围
    if ((position < 0) || (position > (list->length + 1))) {
        return SEQ_LIST_FAIL;
    }
    // 顺序表已满
    if (list->length >= list->capacity) {
        SeqListResize(list, list->capacity * 2);
    }
    // 将指定位置及其以后的节点后移
    for (int i = list->length; i > position; i--) {
        // length序号从1开始，list->length作为数组序号正好是因后移而新增的位置
        list->data[i] = list->data[i - 1];
    }
    // 成功腾出position，插入数据
    list->data[position] = *node;
    list->length++;
    return SEQ_LIST_SUCCESS;
}

/**
 * @brief 删除指定位置的节点
 * @param list 顺序表
 * @param position 要删除的节点，从0开始
 * @param node 删除的节点的数据
 * @return {@SeqListStatus_t}
 */
SeqListStatus_t SeqListDelete(SeqList_t *list, int position, Node_t *node)
{
    // 插入位置超出范围
    if ((position < 0) || (position > (list->length + 1))) {
        return SEQ_LIST_FAIL;
    }
    // 将要删除的数据赋值给node
    *node = list->data[position];
    // 节点前移
    for (int i = position; i < (list->length + 1); i++) {
        list->data[i] = list->data[i + 1];
    }
    // 更新顺序表
    list->length--;
    return SEQ_LIST_SUCCESS;
}

/**
 * @brief 销毁顺序表
 * @param list 顺序表
 */
void SeqListDestroy(SeqList_t *list)
{
    free(list->data);
    list->data = NULL;
    list->length = 0;
    list->capacity = 0;
}


/**
 * @brief 打印顺序表
 * @param list 顺序表指针
 * @return void
 */
void SeqListPrint(SeqList_t *list)
{
    printf("Sequential Table Information: \n");
    printf("-----------------------------------------\n");
    for (int i = 0; i < list->length; i++) {
        printf("name:%s\n", list->data[i].name);
        printf("studentId:%s\n", list->data[i].studentId);
        printf("phoneNum:%s\n", list->data[i].phoneNum);
        printf("gender:%s\n", list->data[i].gender);
        printf("-----------------------------------------\n");
    }
    printf("length: %d, capacity: %d\n", list->length, list->capacity);
    printf("-----------------------------------------\n\n");
}